В помощь выбирающему языг:
задан список файлов в командной строке, надо вывести последовательно 1-ю строку из 1-го файла 1-ю строку из 2-го файла 1-ю строку из 3-го файла ... 1-ю строку из N-го файла 2-ю строку из 1-го файла 2-ю строку из 2-го файла 2-ю строку из 3-го файла ... 2-ю строку из N-го файла
ну и так далее, причем количество строк в файлах разное
Haskell:
import System
import Data.List
main = getArgs >>= mapM readFile >>= mapM_ putStrLn . concat . transpose . map (lines)
Perl:
my @fs = map { open(my $fh, $_); $fh } @ARGV;
while( my @fh = grep { not eof($_) } @fs ) { print my $f = readline($_) foreach (@fh) };
Ruby:
fs = ARGV.map { |fn| File.open(fn) }
while fs.map(&:eof?).include? false
fs.each { |f| puts f.gets unless f.eof? }
end
LISP
(let ((files (mapcar #'open *args*)))
(loop
(unless (mapcan (lambda (f &aux (x (read-line f nil)))
(when x
(format t "~A~%" x) (list x)))
files)
(return))))
C++
#include
#include
#include
#include
#include
using namespace std;
int __cdecl main(int argc, char *argv[]) {
vector files(argc-1);
for (int i=1; i<argc; ++i)
files[i-1].open(argv[i]);
for (bool hasLine=true; hasLine;) {
hasLine = false;
for (size_t i=0; i<files.size(); ++i) {
string line;
if (getline(files[i], line)) {
hasLine = true;
cout << line << endl;
}
}
}
return 0;
}
Erlang
компиляция erlc a.erl
запуск: erl -noshell -s a start -- file file1 file2 file3
-module(a).
-export([start/0]).
start() ->
output([ FD || {ok, FD} <- [ file:open(X, read) || X <- init:get_plain_arguments() ]]),
erlang:halt().
output([]) -> ok;
output(List) ->
output(lists:filter(
fun(FD) ->
case io:get_line(FD, "") of
Line when is_list(Line) ->
io:format(Line), true;
_ -> false
end
end,
List
)
).
C#
static void Main(string[] args) {
for (var files = args.Select(a => new StreamReader(a)).ToList(); 0 < files.Select(f => f.ReadLine()).Where(line => line != null).Count(line => { Console.WriteLine(line); return true; }); );
}
Java
package example.io;
import static net.sourceforge.jfunctions.functions.FunctionToolkit.*;
import static net.sourceforge.jfunctions.io.IOToolkit.file;
import static net.sourceforge.jfunctions.structures.StructureToolkit.list;
import net.sourceforge.jfunctions.io.FileLineParser;
public class SortLinesExample {
public static void main(String[] args) {
for (String line : merge(transform(transform(list(args), file()), FileLineParser.ignoringErrors()))) {
System.out.println(line);
}
}
}
Python
import sys
from itertools import izip_longest as izip, chain, ifilter
def main(args):
for str in ifilter(lambda x: x is not None,
chain.from_iterable( izip( *[open(a) for a in args)] ) ):
print str.rstrip()
if __name__=='__main__':
main(sys.argv[1:])
OCaml
open ExtLib
open List
let (>>) f g x = g (f x)
let (|>) x f = f x;;
let fs = Array.to_list Sys.argv |> tl |> map (open_in >> Std.input_lines) in
while fold_left (fun go e -> Option.may print_endline (Enum.get e); go || not (Enum.is_empty e)) false fs do () done
|